<?php
/**
 * memcache客户端
 * 
 * 
 * 示例：
 * <pre>
 *		$m = new MemcacheClient();
 *		$m->addServer();
 *		$m->add("t19821011","peter");
 *		$m->get("t19821011") . "\n";
 *		$m->replace("t19821011","iwind");
 *		$m->get("t19821011") . "\m";
 *		$m->delete("t19821011");
 *		$m->set("t19821011","中国");
 *		$m->getExtendedStats();
 *	 	$m->get("t19821011");
 *	</pre>
 * 
 * @name MemcacheClient 
 * @version $Id: MemcacheClient.php 312 2008-04-24 23:37:21 peter $
 * @package net.frog.memcache
 * @author peter <openjsp@gmail.com>
 * @since 0.2 rc6
 */
class IMemcacheClient extends IMemcacheHelper {
	/**
	 * 数据压缩
	 *
	 * @var boolean 默认false  MEMCACHE_COMdivSSED
	 */
	private $compressed 	= MEMCACHE_COMPRESSED;
	
	/**
	 * 默认过期时间
	 * 86400
	 */
	private $expire			= 86400;
	
	/**
	 * 删除时延迟的时间
	 *
	 * @var integer
	 */
	private $timeout		= 5;
	
	/**
	 * 是否长连接
	 *
	 * @var boolean
	 */
	private $persistent 		= true;
	
	/**
	 * memcache对象
	 *
	 * @var object
	 */
	private $memcacheObj;
	
	/**
	 * 数据大小的临界点
	 *
	 * @var integer
	 */
	private $threshold = 20000;
	
	/**
	 * 压缩的比例
	 *
	 * @var float
	 */
	private $minSaving = 0.2;
	
	/**
	 * 构造memcache客户端
	 *
	 */
	public function __construct(){
		//if(self::isEnabed()){
			if($this->memcacheObj == NULL){
				$this->memcacheObj = new Memcache;
			}
			$this->memcacheObj;
		//}else{
			//die("not found Memcache");
		//}
	}
	
	/**
	 * 是否压缩
	 * 
	 * MEMCACHE_COMPRESSED  & false & true 
	 * 
	 * @param bool $flag
	 */
	public function setCompressed($flag = MEMCACHE_COMPRESSED){
		$this->compressed = $flag;
	}
	/**
	 * 设定过期时间
	 *
	 * @param integer $exp
	 */
	public function setExpire($exp){
		$this->expire = $exp ? $exp : $this->expire;
	}
	/**
	 * 添加数据
	 *
	 * @param string $key 键名
	 * @param mixed $value 键值
	 * @return boolean
	 */
	public function add($key,$value,$expire =null){
		$expire = $expire ? $expire : $this->expire;
		$lock = $this->memcacheObj->add($key, $value , $this->compressed, $expire);
		return $lock;
	}

	/**
	 * 设置是否长连接
	 *
	 * @param boolean $persistent 
	 */
	public function setPersistent($persistent = false ){
		$persistent = $persistent ? $persistent : $this->persistent;
		$this->persistent = $persistent;
	}

	/**
	 * 添加多个memcache服务器
	 * 
	 * @param host 示服务器的地址
	 * @param port 端口
	 * @param persistent 否是一个持久连接(默认true)
	 * @param weight  这台服务器在所有服务器中所占的权重
	 * @param timeout  连接的持续时间
	 * @param retry_interval 连接重试的间隔时间(默认为15),设置为-1表示不进行重试
	 * @param status   用来控制服务器的在线状态
	 * @param failure_callback 允许设置一个回掉函数来处理错误信息。
	 * @param addServer('memcache_host', 11211, false, 1, 1, -1, false);
	 */
	public function addServer(){
		foreach(self::getServer() as $v){
			$this->memcacheObj->addServer($v["dns"],$v["port"],$this->persistent);
		}
	}
	/**
	 * 关闭memcache服务器
	 *
	 */
	public function close(){
		$this->memcacheObj->close();
	}
	/**
	 * 连接到一个memcache服务器
	 *
	 * @param string $dns DNS
	 * @param integer $port 端口
	 */
	public function connect($dns,$port){
		$this->memcacheObj->connect($dns,$port) or die("Could not connect");
	}
	
	public function debug(){
		
	}
	/**
	 * 对保存的某个key中的值进行减法操作
	 * 
	 * 默认减1
	 * 
	 * @param string $key
	 * @param integer $value
	 * @return integer
	 */
	public function decrement($key,$value=1){
		$newValue = $this->memcacheObj->decrement($key,$value);
		return $newValue;
	}
	/**
	 * 删除cache
	 *
	 * @param string $key
	 * @param integer $timeout		延时
	 * @return boolean
	 */
	public function delete($key,$timeout = NULL){
		$lock = true;
		if($timeout != NULL){
			$lock = $this->memcacheObj->delete($key,$timeout);
		}else {
			$lock = $this->memcacheObj->delete($key);
		}
		return $lock;
	}
	/**
	 *  刷新所有Memcache服务器上保存的项目（类似于删除所有的保存的项目）
	 *
	 */
	public function flush(){
		$this->memcacheObj->flush();
	}
	/**
	 * 根据key获取信息
	 * 
	 * 	 <pre>
	 * 	$xxx->get(Array('some_key', 'second_key'));
	 * 	$xxx->get('some_key');
	 *	 </pre>
	 *
	 * @param string $key 键名
	 * @return mixed  

	 */
	public function get($key){
		return $this->memcacheObj->get($key);
	}
	
	/**
	 * 获取进程池中所有进程的运行系统统计
	 *
	 * @return object
	 */
	public function getExtendedStats(){
		return $this->memcacheObj->getExtendedStats();
	}
	
	/**
	 * 获取运行服务器的参数
	 *
	 */
	public function getServerStatus($dns,$prot){
		return $this->memcacheObj->getServerStatus($dns,$prot);
	}
	
	/**
	 * 获取全部服务器参数
	 *
	 * @return array
	 */
	public function getAllServerStatus(){
		$all = array();
		foreach(self::getServer() as $v){
			$all[$v["dns"]] = self::getServerStatus($v["dns"],$v["port"]); 
		}
		return $all;
	}
	
	/**
	 * 返回服务器的一些运行统计信息
	 *
	 * @param string $type  类型： reset, malloc, maps, cachedump, slabs, items, sizes
	 * @return object
	 */
	public function getStats($type = null){
		if($type != NULL){
			return $this->memcacheObj->getStats($type);
		}		
		return $this->memcacheObj->getStats();
	}
	
	/**
	 * 返回运行的Memcache的版本信息
	 * @param object 返回服务器版本信息
	 */
	public function getVersion(){
		return $this->memcacheObj->getVersion();
	}
	
	/**
	 * 对值进行增量 内存变量的值为数值的有效
	 * 默认加1
	 * @param String 	$key		键名
	 * @param Int 		$value		键值 默认加1
	 */
	public function increment($key,$value=1){
		if(($value*1) != $value){return false;}
		return $this->memcacheObj->increment($key,$value);
	}
	
	/**
	 * 持久连接memcache服务器
	 *
	 * @param string $dns	服务器地址
	 * @param integer $port		端口 默认11211
	 */
	public function pconnect($dns,$port = 11211){
		$this->memcacheObj->pconnect($dns,$port) or die("Could not connect");
	}
	
	/**
	 * 对一个已有的key进行覆写操作
	 * 
	 * 替换一个已经存在Memcache服务器上的项目（功能类似Memcache::set）
	 * 
	 * @param string $key	键名
	 * @param string $value	键值
	 * @param Integer $timeout	数据保存有效时间
	 */
	public function replace($key,$value,$expire=null){
		$expire = $expire ? $expire : $this->expire;
		return $this->memcacheObj->replace($key,$value,$this->compressed,$expire);
	}
	
	/**
	 * 保存一个数据到Memcache服务器上
	 * 第一个参数是数据的key，用来定位一个数据
	 * 第二个参数是需要保存的数据内容，这里是一个字符串
	 * 第三个参数是一个标记，一般设置为0或者MEMCACHE_COMPRESSED就行了
	 * 第四个参数是数据的有效期，就是说数据在这个时间内是有效的，如果过去这个时间，
	 * 那么会被Memcache服务器端清除掉这个数据，
	 * 单位是秒，如果设置为0，则是永远有效，我们这里设置了86400，就是一天有效时间
	 *
	 * @param string $key		键名
	 * @param string $value		键值
	 * @param integer $expire		数据保存有效时间
	 * @return boolean				返回操作信息
	 */
	public function set($key,$value,$expire=null){
		$expire = $expire ? $expire : $this->expire;
		return $this->memcacheObj->set($key,$value,$this->compressed,$expire);
	}
	
	/**
	 * 数据临界点(设定超出设定数据存储大小时自动整理数据)
	 * 
	 * @param integer $int	数据临界点
	 */
	public function setThreshold($int){
		$this->threshold = $int;
	}
	/**
	 * 获取数据临界点
	 *
	 * @return integer
	 */
	public function getThreshold(){
		return $this->threshold;
	}
	
	/**
	 * 压缩比例
	 *
	 * @param integer $int	设定压缩比例
	 */
	public function setMinSaving($int){
		$this->minSaving = $int;
	}
	
	/**
	 * 获取压缩比比例
	 * 
	 * @return integer
	 */
	public function getMinSaving(){
		return $this->minSaving;
	}
	
	/**
	 * 设置memcache在某个临界点进行指定比例压缩
	 * setCompressThreshold方法的作用是对大于某一大小的数据进行压缩。
	 * setCompressThreshold方法有两个参数，
	 * 
	 * 第一个参数表示处理数据大小的临界点，
	 * 第二个参数表示压缩的比例，默认为0.2 / 20%
	 *
	 */
	public function setCompressThreshold($threshold=NULL,$minSaving=NULL){
		if($threshold == NULL){
			$threshold = $this->threshold;
		}
		if($minSaving==NULL){
			$minSaving = $this->minSaving;
		}
		return $this->memcacheObj->setCompressThreshold($threshold,$minSaving);
	}
	
	/**
	 * 在运行时修改服务器的参数
	 * 
	 * @param string $host 示服务器的地址
	 * @param integer $port 端口
	 * @param integer $timeout  连接的持续时间
	 * @param integer $retry_interval 连接重试的间隔时间(默认为15),设置为-1表示不进行重试
	 * @param boolean $status   用来控制服务器的在线状态
	 * @param callback $failure_callback 允许设置一个回调函数来处理错误信息。
	 */
	public function setServerParams($dns,$prot,$timeout=true,$retry_interval=15,$status=true,$failure_callback=""){
		$this->memcacheObj->setServerParams($dns,$prot,$timeout,$retry_interval,$status,$failure_callback);
	}
}
?>